<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>队列结构实现</title>
</head>
<body>
    <script>
        class Queue{
            items = []

            //向队列尾部添加一个或多个元素
            enqueue(element){
                return this.items.push(element)
            }

            //移除队列的第一项,并返回移除的元素
            dequeue(){
                return this.items.shift();
            }

            //返回队列的第一个元素,最先添加的也是最先被移除的
            front(){
                return this.items[0];
            }

            //判断队列是否为空,是则返回true,否则返回false
            isEmpty(){
                return this.items.length == 0;
            }

            //返回队列包含的元素个数
            size(){
                return this.items.length;
            }

            //打印队列中的元素
            toString(){
                let str = '';
                for (const val of this.items) {
                    str += val+'  ';
                }
                return console.log(str);
            }
        }
        /* let q = new Queue();
        q.enqueue(1);
        q.enqueue(2);
        q.enqueue(3);
        q.enqueue(4);
        q.toString(); */

        //面试题:击鼓传花
        /*规则:
            1.传入所有游戏人的名字,然后传入指定淘汰的数字,然后所有人安顺序数数,数到指定数字的人淘汰,其他人继续从头数数,知道只剩下一个人,则游戏结束
            2.请找出最后的胜者.
        */
        function passGame(nameList,num) {  
            let q = new Queue();
            for (const val of nameList) {
                q.enqueue(val)
            }
            while(q.size()>1){
                for (let i = 0; i < num-1; i++) {
                    q.enqueue(q.dequeue())
                }
                q.dequeue()
            }

            let name = q.front();
            let nameIndex = nameList.indexOf(name);
            console.log('获胜者是:'+name+'. 对应的下标是:'+nameIndex);
        }
        let nameList = ['张三','李四','王五','王麻子','郭杰瑞','小红','李雷'];
        passGame(nameList,4); 
    </script>
</body>
</html>